package com.resource.utils;

import org.apache.commons.collections4.CollectionUtils;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;


/**
 * @Author Tao.yu
 * @Date 2019/11/5 14:44
 * @Version v3.0
 **/
public class CheckUtil {
	/**
	 * 确定给定对象是否是数组:
	 *
	 * @param t
	 * @return
	 */
	public static boolean isArray(Object t) {
		return (null != t && t.getClass().isArray());
	}

	/**
	 * 确定给定的数组是为空
	 *
	 * @param array
	 * @return
	 */
	public static boolean isEmpty(Object[] array) {
		return (array == null || array.length == 0);
	}

	/**
	 * 确定给定的数组是不为空
	 *
	 * @param array
	 * @return
	 */
	public static boolean isNotEmpty(Object[] array) {
		return !isEmpty(array);
	}

	/**
	 * 判断对象是空
	 *
	 * @param obj
	 * @return
	 */
	public static boolean isEmpty(final Object obj) {
		return (obj == null) || "".equals(obj);
	}

	/**
	 * 判断对象不为空
	 *
	 * @param obj
	 * @return
	 */
	public static boolean isNotEmpty(final Object obj) {
		return !(isEmpty(obj));
	}

	/**
	 * 集合类为空
	 *
	 * @param coll
	 * @return
	 */
	public static boolean isBlank(final Collection<?> coll) {
		return (coll == null) || (coll.isEmpty());
	}

	/**
	 * 集合类不为空
	 *
	 * @param coll
	 * @return
	 */
	public static boolean isNotBlank(final Collection<?> coll) {
		return !(isBlank(coll));
	}

	/**
	 * map为空
	 *
	 * @param map
	 * @return
	 */
	public static boolean isBlank(final Map map) {
		return (map == null) || (map.size() <= 0);
	}

	/**
	 * map不为空
	 *
	 * @param map
	 * @return
	 */
	public static boolean isNotBlank(final Map map) {
		return !(isBlank(map));
	}

	/**
	 * 比较2个对象是否一致
	 *
	 * @param a
	 * @param b
	 * @return
	 */
	public static boolean isTheSame(Object a, Object b) {
		if (a == null && b == null) {
			return true;
		}
		return a != null && a.equals(b);
	}

	/**
	 * 对象为空返回message
	 *
	 * @param obj
	 * @param message
	 */
	public static void assertNotNull(final Object obj, final String message) throws ServiceException {
		if (isEmpty(obj)) {
			throw new ServiceException(message);
		}
	}

	/**
	 * 对象为空返回message以及code
	 *
	 * @param obj
	 * @param message
	 * @param code
	 */
	public static void assertNotNull(final Object obj, final String message, final Integer code) throws ServiceException {
		if (isEmpty(obj)) {
			throw new ServiceException(message, code);
		}
	}

	/**
	 * 集合为空返回message
	 *
	 * @param coll
	 * @param message
	 */
	public static void assertNotNull(final Collection<?> coll, final String message) throws ServiceException {
		if (CollectionUtils.isEmpty(coll)) {
			throw new ServiceException(message);
		}
	}

	/**
	 * 集合为空返回message以及code
	 *
	 * @param coll
	 * @param message
	 */
	public static void assertNotNull(final Collection<?> coll, final String message, final Integer code) throws ServiceException {
		if (CollectionUtils.isEmpty(coll)) {
			throw new ServiceException(message, code);
		}
	}

	/**
	 * 对象不相等返回message
	 *
	 * @param a
	 * @param b
	 * @param message
	 */
	public static void assertEquals(final Object a, Object b, final String message) throws ServiceException {
		if (!isTheSame(a, b)) {
			throw new ServiceException(message);
		}
	}

	/**
	 * 对象不相等返回message以及code
	 *
	 * @param a
	 * @param b
	 * @param message
	 */
	public static void assertEquals(final Object a, final Object b, String message, final Integer code)throws ServiceException {
		if (!isTheSame(a, b)) {
			throw new ServiceException(message, code);
		}
	}

	/**
	 * 判断集合中是否包含另一个元素
	 *
	 * @param list
	 * @param list2
	 * @return
	 */
	public static boolean isContains(List<Integer> list, List<Integer> list2) {
		for (Object obj : list) {
			if (list2.contains(obj)) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 判断集合中是否包含某个以外的值
	 *
	 * @param list
	 * @param o
	 * @return
	 */
	public static boolean isContains(List<Integer> list, Object o) {
		for (Object obj : list) {
			if (!obj.equals(o)) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 检测是否未手机号
	 * 中国电信号段
	 * 133、149、153、173、177、180、181、189、199
	 * 中国联通号段
	 * 130、131、132、145、155、156、166、175、176、185、186
	 * 中国移动号段
	 * 134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188、198
	 * 其他号段
	 * 14号段以前为上网卡专属号段，如中国联通的是145，中国移动的是147等等。
	 * 虚拟运营商
	 * 电信：1700、1701、1702
	 * 移动：1703、1705、1706
	 * 联通：1704、1707、1708、1709、171
	 *
	 * @param mobile
	 * @return
	 */
	public static boolean matchMobile(String mobile) {
		if (mobile == null) {
			return false;
		}
		String regex = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$";
		return Pattern.matches(regex, mobile);
	}

	/**
	 * 检测Email
	 *
	 * @param email
	 * @return
	 */
	public static boolean matchEmail(String email) {
		if (email == null) {
			return false;
		}
		String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";
		return Pattern.matches(regex, email);
	}


	/**
	 * 检测域名
	 * @param domain
	 * @return
	 */
	public static boolean matchDomain(String domain) {
		if (domain == null) {
			return false;
		}
		String regex = "^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$";
		return Pattern.matches(regex, domain);
	}

}
